/**
 * @file AStar.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief A*寻路类
 */

#ifndef __ASTAR_H__
#define __ASTAR_H__

#include "Direction.h"
#include "Cmd.h"
#include <list>

/**
 * @brief A*地图结点
 */
class AStarNode {
public:
    int x, y; // 栅格坐标
    int dir; // 方向
    double g = 0; // 目前的代价
    double h = 0; // 剩余代价
    AStarNode *parent = nullptr; // 父结点
    std::list<AStarNode *> childs; // 所有孩子节点

public:
    void moveStep(int dir);
    AStarNode(int x, int y, double g, int parentDir, int dir, int endX, int endY, bool isEmpty);
    double cost() const {
        return g + h;
    }
};

/**
 * @brief A*算法
 */
class AStar {
public:
    static std::list<Cmd> getCmdSeq(int startX, int startY, int endX, int endY, bool isEmpty, int endRadius);
};

#endif // __ASTAR_H__
